﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class ExpressionTree表达式树_表达式学习1 : System.Web.UI.Page
{

    //栗子中的 Where1 和 Where2 两个方法,唯一的不同,一个是委托,一个是表达式树   同样运行Where1和Where2 一万次,Where2是0ms,Where1是57ms   也就是说从Func<User, bool>转为Expression<Func<User, bool>>一万次需要57ms 
    //  这对于我这样一个追求性能的人来说,实在是有点难受!   到不至于不能接受,只有有点难受 
    //  但从另一方面我也在考虑,为什么像这样的lamda不能直接预编译成Expression呢?期待微软的优化吧~ 

    protected void Page_Load(object sender, EventArgs e)
    {
        Where1(u => u.Id == 1);
        Where2(u => u.Id == 1);
        Func<M_Ask, int> getid = 取一个属性值();

        //动态获取属性值
        System.Linq.Enumerable.Range(1, 20).ToList().ForEach((i) =>
        {

            M_Ask ask = new M_Ask() { Id = i };
            Response.Write(getid(ask) + "<br/>");

        });
        //动态获取属性值
        M_Ask ask1 = new M_Ask() { Id = 99 };
        Func<M_Ask, int> act2 = 取一个属性值表达式版<M_Ask, int>(ask1, "Id");



    }








    /// <summary>
    /// 取值表达式测试
    /// </summary>
    /// <param name="expr"></param>
    public Func<M_Ask, int> 取一个属性值()
    {
        Expression<Func<M_Ask, int>> expr = p => p.Id;

        return expr.Compile();
    }
    public Func<T, ValT> 取一个属性值表达式版<T, ValT>(T obj, string propertyName)
    {
        //定义一个参数 p
        var p = Expression.Parameter(typeof(T), "p");
        //定义一个属性如 p.id
        var val = Expression.PropertyOrField(p, propertyName);
        //p=>p.id
        //LambdaExpression xxx = Expression.Lambda(val, p);
        //Delegate res=    xxx.Compile();

        //p=>p.id
        Expression<Func<T, ValT>> func = Expression.Lambda<Func<T, ValT>>(val, p);

        return func.Compile();
    }


    public void Where1(Expression<Func<M_Ask, bool>> expr) { }
    public void Where2(Func<M_Ask, bool> expr) { }

}